package session

import (
	"sync"
	"time"
	"video_server/api/dbops"
	"video_server/api/defs"
	"video_server/api/utils"
)



var sessionMap *sync.Map

func init(){
	sessionMap = &sync.Map{}
}

func LoadSessionsFromDB(){
	r, err := dbops.RetrieveAllSession()
	if err != nil {
		return
	}
	//遍历map
	r.Range(func(k, v interface{}) bool {
		//断言成功则返回一个session
		session := v.(*defs.SimpleSession)
		sessionMap.Store(k,session)
		return true
	})
}

// 返回当前时间的毫秒时间
func nowInMilli() int64{
	return time.Now().UnixNano()/1000000
}

func deleteExpiredSession(sessionId string){
	sessionMap.Delete(sessionId)
	dbops.DeleteSession(sessionId)
}

func GenerateNewSessionID(username string) string{
	id,_ := utils.NewUUID()
	currentTime := nowInMilli()
	ttl := currentTime + 30*60*1000		//Serverside session valid time: 30min

	ss := &defs.SimpleSession{
		Username: username,
		TTL: ttl,
	}
	//放sync.map中，作为缓存直接放在内存中，然后写入数据库
	sessionMap.Store(id,ss)
	dbops.InsertSession(id,ttl,username)
	return id
}

//session过期则删除，否则返回 username
func IsSessionExpired(sessionId string) (string, bool) {
	//[1] 判断当前时间 与 内存中 session 时间，判断过期
	oldSession, ok := sessionMap.Load(sessionId)
	if ok{
		currentTime := nowInMilli()
		//当前时间超过了TTL，过期了
		if currentTime > oldSession.(*defs.SimpleSession).TTL  {
			deleteExpiredSession(sessionId)
			return "",true
		}

		return oldSession.(*defs.SimpleSession).Username,false
	}
	//未获取到session
	return "",true
}